/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"A0C10336-A13E-4479-9A95-D456A7A160DB",variableType:4}
 */
var gAnioHasta = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"7E98CE9A-AFB1-458B-862A-4207F19FCFC8",variableType:4}
 */
var gAnioDesde = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"2E9809D7-0CA5-4BBD-9390-30AE94EB8D8D",variableType:4}
 */
var gMesHasta = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"71AE541D-496E-4852-8179-27D84D8F44A1",variableType:4}
 */
var gMesDesde = null;

/**
 * @type {String}
 *
 * @properties={typeid:35,uuid:"D8C4C7DA-4383-44C2-B022-613DE844A2FE"}
 */
var gFecha = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"4F857A8D-F230-47C9-A894-534CD6EF1598",variableType:4}
 */
var zconf_moneda_dolar = 2;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"64987B29-F9DD-4D51-9676-694596C2CFBB",variableType:4}
 */
var z_conf_asiento_normal = 0;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"45C36E3C-287F-45DB-8024-6B45011661C7",variableType:4}
 */
var z_conf_asiento_apertura = 1;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"C0C92AB1-8089-435E-8B96-720ECFBAAA20",variableType:4}
 */
var z_conf_asiento_cierre = 2;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"3AE9DA96-49C3-44FF-A69A-A12923FE841A",variableType:4}
 */
var zconf_centro_default = 1;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"04609598-64F9-4F15-8C2C-474E331F78D8",variableType:4}
 */
var zconf_division_default = 1;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"8216C2F0-B672-4CC6-B543-0F0C0B66BFC8",variableType:4}
 */
var gMonedaCarga = 1;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"2A6B0EAE-73D3-4217-A456-26330A507B39",variableType:4}
 */
var gAnio = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"A8016C0F-E8E1-407B-93E5-59E87BA14D02",variableType:4}
 */
var gBienBusca = null;

/**
 * @type {String}
 *
 * @properties={typeid:35,uuid:"91201E17-5C65-44BB-9C75-B375CD94A726"}
 */
var gboton = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"1CCF4591-73EA-42ED-9685-D7C53B09D3D5",variableType:4}
 */
var gcapitulo = null;

/**
 * @type {String}
 *
 * @properties={typeid:35,uuid:"2C1039C5-FE62-4593-BCEF-541004CC014D"}
 */
var gcuenta_busca = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"28AE16FB-12D1-49B2-9708-CF7DAC22A3F1",variableType:4}
 */
var gdebe_haber = null;

/**
 * @type {String}
 *
 * @properties={typeid:35,uuid:"DB104A74-7F8A-4F1A-90C6-567E61A57A41"}
 */
var gFechaDesde = null;

/**
 * @type {String}
 *
 * @properties={typeid:35,uuid:"21C65D90-F32E-406F-A1DF-84CA5DCDC859"}
 */
var gFechaHasta = null;

/**
 * @type {String}
 *
 * @properties={typeid:35,uuid:"74391422-EB76-471A-97E5-13E2B4503C0E"}
 */
var gform_origen = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"5F0B7252-8518-476C-AB50-3C40DA0D0264",variableType:4}
 */
var gMes = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"3C35D3B1-9B77-4FCA-80C4-2B311D0F39C1",variableType:4}
 */
var gmoneda_consulta = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"0236E908-708E-4FCF-91FE-F03F9B04E6EF",variableType:4}
 */
var grubro = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"EB601B48-5FCD-4F18-BB8C-406A823A75FB",variableType:4}
 */
var gsubcapitulo = null;

/**
 * @type {String}
 *
 * @properties={typeid:35,uuid:"F0A36EEF-2C9B-4F96-981F-BC2507B6766F"}
 */
var gtitulo = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"EB804BB0-A215-46A7-AA7E-FBDA5F3ABB03",variableType:8}
 */
var gtotal_debe = 0;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"72F2A7E2-411C-4BD5-B554-BBAD95EDBDAD",variableType:8}
 */
var gtotal_haber = 0;

/**
 * Callback method for when solution is opened.
 *
 * @properties={typeid:24,uuid:"0C8A7457-6636-4D09-8422-CAE6180D0D70"}
 */
function onSolutionOpen_contable() {
	globals.glegajo 			= gusuario_to_usuarios.usuario_id
	globals.gmoneda_consulta 	= 1
	databaseManager.addTableFilterParam("contable",null,"empresa","=",globals.gUservID,"filtro_empresa")
	
	var $hoy 	= application.getServerTimeStamp()
	var $sql	= 'SELECT ejercicio_id FROM ejercicios WHERE empresa = ? AND fecha_inicio <= ? AND fecha_fin >= ?'
	var $args 	= [globals.gUservID, $hoy, $hoy]
	var $ds 	= databaseManager.getDataSetByQuery('contable',$sql,$args,-1)
	if ($ds.getMaxRowIndex() != 1)
	{
		globals.DIALOGS.showWarningDialog('Aviso','No hay ejercicio vigente','OK')
		globals.formEnVentana('elegir_ejercicio','ELIGE_EJERCICIO','Elija Ejercicio')
		return
	}
	globals.gEjercicio = $ds.getValue(1,1)
	
	globals.gMes
	globals.gAnio
	
	databaseManager.addTableFilterParam("contable",null,"ejercicio_id","=",globals.gEjercicio,"filtro_ejercicio")
}

/**
 * @param {JSFoundset<db:/contable/asiento>} fs_asiento
 * 
 * @properties={typeid:24,uuid:"6D169035-1DAA-4BCC-8B25-C8BF5A902D0D"}
 */
function gactualiza_saldos(fs_asiento) 
{
	if (fs_asiento.asiento_to_saldos.getSize() == 0)
	{	
		fs_asiento.asiento_to_saldos.newRecord()
		fs_asiento.asiento_to_saldos.empresa 	= fs_asiento.empresa
		fs_asiento.asiento_to_saldos.debe_pes   = 0
		fs_asiento.asiento_to_saldos.debe_dol   = 0
		fs_asiento.asiento_to_saldos.haber_pes  = 0
		fs_asiento.asiento_to_saldos.haber_dol  = 0
		fs_asiento.asiento_to_saldos.saldo_pes_cierre  = 0
		fs_asiento.asiento_to_saldos.saldo_dol_cierre  = 0
	}
	if (fs_asiento.columna == 'D')
	{
		fs_asiento.asiento_to_saldos.debe_pes += fs_asiento.importe
		fs_asiento.asiento_to_saldos.debe_dol += fs_asiento.impodol
		if (fs_asiento.asiento_to_asiento_cab.tipo_actualizacion == globals.z_conf_asiento_cierre)
		{
			fs_asiento.asiento_to_saldos.saldo_pes_cierre += fs_asiento.importe
			fs_asiento.asiento_to_saldos.saldo_dol_cierre += fs_asiento.impodol			
		}
	}
	else
	{
		fs_asiento.asiento_to_saldos.haber_pes += fs_asiento.importe
		fs_asiento.asiento_to_saldos.haber_dol += fs_asiento.impodol
		if (fs_asiento.asiento_to_asiento_cab.tipo_actualizacion == globals.z_conf_asiento_cierre)
		{
			fs_asiento.asiento_to_saldos.saldo_pes_cierre -= fs_asiento.importe
			fs_asiento.asiento_to_saldos.saldo_dol_cierre -= fs_asiento.impodol			
		}
	}
}

/**
 * @param {Number} pcuenta = cuenta contable
 * @param {Number} pdivision = division
 * @param {Number} pcentro = centro
 * @param {Number} pmes_desde = mes de inicio
 * @param {Number} pmes_hasta = mes de fin
 * @param {Number} panio_desde  = anio de inicio
 * @param {Number} panio_hasta  = anio de fin
 * @param {Number} psaldo_pesos = saldo pesos
 * @param {Number} psaldo_dolar = saldo dolares
 * @param {Number} pmoneda
 * @properties={typeid:24,uuid:"AF066BEF-0C4F-47B8-B11C-0E3B241D7E45"}
 * @AllowToRunInFind
 */
function gcalcular_saldo(pcuenta,pdivision,pcentro,pmes_desde,panio_desde,pmes_hasta,panio_hasta, psaldo_pesos, psaldo_dolar,pmoneda) {
	
	if (pmes_hasta == 0)
	{
		pmes_hasta = 12
		panio_hasta = panio_hasta -1
	}
	/** @type {JSFoundSet<db:/contable/saldos>} */
	var fs_saldos = databaseManager.getFoundSet("contable","saldos")
	var estado = fs_saldos.find()
	if (estado == false)
	{
		globals.DIALOGS.showWarningDialog('Aviso','Error al hacer find','OK')
		return null
	}
	if (pcentro != null)
	{
		fs_saldos.centro = pcentro
	}
	if (pdivision != null)
	{
		fs_saldos.division = pdivision
	}
	fs_saldos.cuentas_id = pcuenta
	fs_saldos.anio = '<'+panio_hasta
	
	fs_saldos.newRecord()
	
	if (pcentro != null)
	{
		fs_saldos.centro = pcentro
	}
	if (pdivision != null)
	{
		fs_saldos.division = pdivision
	}
	fs_saldos.cuentas_id = pcuenta
	fs_saldos.anio = panio_hasta
	fs_saldos.mes  = '<='+pmes_hasta	
	
	fs_saldos.search()
	
	psaldo_pesos = 0
	psaldo_dolar = 0
	var cant = databaseManager.getFoundSetCount(fs_saldos)
	for (var i = 1 ; i <= cant ; i++)
	{
		fs_saldos.setSelectedIndex(i)	
		psaldo_pesos = psaldo_pesos + fs_saldos.debe_pes - fs_saldos.haber_pes
		psaldo_dolar = psaldo_dolar + fs_saldos.debe_dol - fs_saldos.haber_dol
	}	
	if (pmoneda == 2) 
	{
		return psaldo_dolar	
	}
	else
	{
		return psaldo_pesos	
	} 
}

/**
 * Record pre-delete trigger.
 * Validate the record to be deleted.
 * When false is returned the record will not be deleted in the database.
 * When an exception is thrown the record will also not be deleted in the database but it will be added to databaseManager.getFailedRecords(),
 * the thrown exception can be retrieved via record.exception.getValue().
 *
 * @param {JSRecord} record record that will be deleted
 *
 * @returns {Boolean}
 *
 * @properties={typeid:24,uuid:"8837984C-52FD-4895-91CA-61DEE488D555"}
 */
function onRecordDelete_generico(record) {
	globals.DIALOGS.showWarningDialog("Aviso","No puede eliminar dicho registro","Ok")
	return false
}

/**
 * @param {String} frm
 * @param {Array<String>} cols
 * @param {String} extension
 * 
 * @properties={typeid:24,uuid:"2326B652-985F-491E-BB31-35FC16A016A8"}
 */
function gExportaExcel(frm, cols, extension) {
	
	var comienzo_archivo
	var	comienzo_linea
	var marca_txt
	var separador
	var fin_linea
	var	fin_archivo
	
	if (extension == 'csv')
	{
		comienzo_archivo 	= '' 
		comienzo_linea		= '' 
		marca_txt 			= '"'
		separador 			= ';'
		fin_linea 			= ''
		fin_archivo 		= ''
	}
	else
	{
		comienzo_archivo 	= '<TABLE CELLPADDING="1" CELLSPACING="0" BORDER="0">'
		comienzo_linea 		= '<tr><td>'
		marca_txt 			= ''
		separador 			= '</td><td>'
		fin_linea 			= '</td></tr>'
		fin_archivo 		= '</table>'
	}
	
	var $nombre = 'c:/'+frm+' - ' + globals.glegajo + '.' + extension
	var jsFile
	if (application.getApplicationType() == APPLICATION_TYPES.WEB_CLIENT)
	{
		jsFile = plugins.file.createFile($nombre)
	}
	else
	{
		jsFile = plugins.file.showFileSaveDialog($nombre)
	}
	if (jsFile)
	{
		var fw = new Packages.java.io.FileWriter(jsFile.getAbsolutePath());
		var bw = new Packages.java.io.BufferedWriter(fw);
		
		var fs = forms[frm].foundset
		if (comienzo_archivo != '')
		{
			bw.write(comienzo_archivo,0,comienzo_archivo.length)
			bw.newLine()
		}
		
		var tbl = databaseManager.getTable( fs)
		if (cols == null)
		{
			cols = tbl.getColumnNames()
		}
		//ESCRIBO EL NOMBRE DE LAS COLUMNAS EN LA PRIMER LINEA DEL ARCHIVO
		var linea = comienzo_linea
		for (var j = 1 ; j < cols.length ; j++)
		{
			if (j != 1)
				linea += separador
			linea += marca_txt + cols[j] + marca_txt
		}
		linea += fin_linea
		bw.write(linea,0,linea.length)
		linea = comienzo_linea
		
		var cuantos = databaseManager.getFoundSetCount(fs)
		var i = 1
		
		while (i <= cuantos)
		{
			fs.setSelectedIndex(i)
			for (j = 1 ; j < cols.length ; j++)
			{
				var campo = fs.getDataProviderValue(cols[j])
				
				if (solutionModel.getForm(frm).getField(cols[j]).displayType == JSField.TEXT_FIELD  && forms[frm].elements[cols[j]].getValueListName() != null || (tbl.getColumn(cols[j]) == null))
				{
					forms[frm].elements[cols[j]].requestFocus()
					forms[frm].elements[cols[j]].selectAll()
					var campo = forms[frm].elements[cols[j]].getSelectedText()
				}
				else
				{
					if ((tbl.getColumn(cols[j])!= null) && (tbl.getColumn(cols[j]).getType() == JSColumn.NUMBER))
						campo = utils.numberFormat(campo,2)
					else
					{
						if ((tbl.getColumn(cols[j])!= null) && (tbl.getColumn(cols[j]).getType() == JSColumn.DATETIME))
							campo = utils.dateFormat(campo, 'dd-MM-yyyy')
					}
				}
				if (j != 1)
					linea+= separador
				linea+= marca_txt + campo + marca_txt
			}
			linea += fin_linea
			bw.newLine()
			bw.write(linea,0,linea.length)
			linea = comienzo_linea
			i++
		}
		if (fin_archivo != '')
		{
			bw.write(fin_archivo,0,fin_archivo.length)
		}
		bw.close()
		fw.close()

		if (application.getApplicationType() == APPLICATION_TYPES.WEB_CLIENT)
		{
			var mimeType = 'application/vnd.ms-excel'
			if (!plugins.file.writeFile(jsFile.getName(), jsFile.getBytes(), mimeType))
			{
				globals.DIALOGS.showErrorDialog('Error','Ocurrio un error y no se pudo grabar el archivo','OK');
			}
			plugins.file.deleteFile(jsFile.getAbsolutePath())
		}
		else
		{
			application.executeProgram("rundll32.exe", ["url.dll,FileProtocolHandler", jsFile.getAbsolutePath()])
		}	
	}
}

/**
 * @properties={typeid:24,uuid:"2DC741BF-ACF2-466A-909C-A22535B4CEF7"}
 */
function gresta_saldos(fs_asiento) {
	if (fs_asiento.asiento_to_saldos.getSize() == 0)
	{	
		fs_asiento.asiento_to_saldos.newRecord()
		fs_asiento.asiento_to_saldos.debe_pes   = 0
		fs_asiento.asiento_to_saldos.debe_dol   = 0
		fs_asiento.asiento_to_saldos.haber_pes  = 0
		fs_asiento.asiento_to_saldos.haber_dol  = 0
		fs_asiento.asiento_to_saldos.saldo_pes_cierre  = 0
		fs_asiento.asiento_to_saldos.saldo_dol_cierre  = 0
	}
	if (fs_asiento.columna == 'D')
	{
		fs_asiento.asiento_to_saldos.debe_pes -= fs_asiento.importe
		fs_asiento.asiento_to_saldos.debe_dol -= fs_asiento.impodol
		if (fs_asiento.asiento_to_asiento_cab.tipo_actualizacion == globals.z_conf_asiento_cierre)
		{
			fs_asiento.asiento_to_saldos.saldo_pes_cierre -= fs_asiento.importe
			fs_asiento.asiento_to_saldos.saldo_dol_cierre -= fs_asiento.impodol			
		}
	}
	else
	{
		fs_asiento.asiento_to_saldos.haber_pes -= fs_asiento.importe
		fs_asiento.asiento_to_saldos.haber_dol -= fs_asiento.impodol
		if (fs_asiento.asiento_to_asiento_cab.tipo_actualizacion == globals.z_conf_asiento_cierre)
		{
			fs_asiento.asiento_to_saldos.saldo_pes_cierre += fs_asiento.importe
			fs_asiento.asiento_to_saldos.saldo_dol_cierre += fs_asiento.impodol			
		}
	} 
}

/**
 * @properties={typeid:24,uuid:"CB5920FC-51FD-423B-B29A-D4553804E040"}
 */
function gresta_aux_saldos(fs_asiento, pcierre) {
	if (fs_asiento.asiento_aux_to_saldos.getSize() == 0)
	{	
		fs_asiento.asiento_aux_to_saldos.newRecord()
		fs_asiento.asiento_aux_to_saldos.debe_pes   = 0
		fs_asiento.asiento_aux_to_saldos.debe_dol   = 0
		fs_asiento.asiento_aux_to_saldos.haber_pes  = 0
		fs_asiento.asiento_aux_to_saldos.haber_dol  = 0
		fs_asiento.asiento_aux_to_saldos.saldo_pes_cierre  = 0
		fs_asiento.asiento_aux_to_saldos.saldo_dol_cierre  = 0
	}
	if (fs_asiento.columna == 'D')
	{
		fs_asiento.asiento_aux_to_saldos.debe_pes -= fs_asiento.importe
		fs_asiento.asiento_aux_to_saldos.debe_dol -= fs_asiento.impodol
		if (pcierre == globals.z_conf_asiento_cierre)
		{
			fs_asiento.asiento_aux_to_saldos.saldo_pes_cierre -= fs_asiento.importe
			fs_asiento.asiento_aux_to_saldos.saldo_dol_cierre -= fs_asiento.impodol			
		}
	}
	else
	{
		fs_asiento.asiento_aux_to_saldos.haber_pes -= fs_asiento.importe
		fs_asiento.asiento_aux_to_saldos.haber_dol -= fs_asiento.impodol
		if (pcierre == globals.z_conf_asiento_cierre)
		{
			fs_asiento.asiento_aux_to_saldos.saldo_pes_cierre += fs_asiento.importe
			fs_asiento.asiento_aux_to_saldos.saldo_dol_cierre += fs_asiento.impodol			
		}
	} 
}

/**
 * @properties={typeid:24,uuid:"D80348CF-66E7-47C6-AAFF-B943662953B9"}
 */
function gbusca_cuenta(displayValue, realValue, record, valueListName) {
	var $servidor = 'contable'
	if (displayValue == null && realValue == null) 
	{
// Devuelve todos los registros
		var args = [globals.gUservID]
		return databaseManager.getDataSetByQuery($servidor, "select cuenta_nueva, cuenta_id from cuentas where empresa = ? and imputable = 1 and marca_imprimir = 1 order by capitulo, subcapitulo, rubro, cuenta, subcuenta", args, 100);
	}
	else 
		if (displayValue != null) 
		{
// devuelve los valores que va filtrando segun lo que va poniendo en el TYPE_AHEAD
			var args = new Array() 
			args[0]="%"+ displayValue+ "%"
			args[1]=globals.gUservID
			return databaseManager.getDataSetByQuery($servidor, "select cuenta_nueva, cuenta_id from cuentas where upper(cuenta_nueva) like upper(?) and empresa = ? and imputable = 1  and marca_imprimir = 1 order by capitulo, subcapitulo, rubro, cuenta, subcuenta", args, 100);
		}
		else
			if (realValue != null) 
			{
// Devuelve el valor que tiene el campo, si es que ya tiene uno			
				var args = new Array() 
				args[0]=realValue
				args[1]=globals.gUservID		
				return databaseManager.getDataSetByQuery($servidor, "select cuenta_nueva, cuenta_id from cuentas where cuenta_id = ? and empresa = ? and imputable = 1  and marca_imprimir = 1 order by capitulo, subcapitulo, rubro, cuenta, subcuenta", args, 1);
   			}
	return null
}

/**
 * @properties={typeid:24,uuid:"DB244450-A9D2-4555-9AF9-E75380A4430D"}
 */
function gCuentaNuevaBusca(displayValue, realValue, record, valueListName) {
	var $servidor = 'contable'
	if (displayValue == null && realValue == null) 
	{
// Devuelve todos los registros
		var args = [globals.gUservID]
		return databaseManager.getDataSetByQuery($servidor, "select cuenta_nueva, cuenta_busca from cuentas where empresa = ? and imputable = 1 order by capitulo, subcapitulo, rubro, cuenta,subcuenta", args, 100);
	}
	else 
		if (displayValue != null) 
		{
// devuelve los valores que va filtrando segun lo que va poniendo en el TYPE_AHEAD
			var args = new Array() 
			args[0]="%"+ displayValue+ "%"
			args[1]=globals.gUservID
			return databaseManager.getDataSetByQuery($servidor, "select cuenta_nueva, cuenta_busca from cuentas where upper(cuenta_nueva) like upper(?) and empresa = ? and imputable = 1 order by capitulo, subcapitulo, rubro, cuenta,subcuenta", args, 100);
		}
		else
			if (realValue != null) 
			{
// Devuelve el valor que tiene el campo, si es que ya tiene uno			
				var args = new Array() 
				args[0]=realValue
				args[1]=globals.gUservID		
				return databaseManager.getDataSetByQuery($servidor, "select cuenta_nueva, cuenta_busca from cuentas where cuenta_busca = ? and empresa = ? order by capitulo, subcapitulo, rubro, cuenta,subcuenta", args, 1);
   			}
	return null
}

/**
 * @properties={typeid:24,uuid:"C4E93AA3-1C6F-4E07-B791-256693916B36"}
 */
function gCuentaNuevaBusca2(displayValue, realValue, record, valueListName) {
	var $servidor = 'contable'
	if (displayValue == null && realValue == null) 
	{
// Devuelve todos los registros
		var args = [globals.gUservID]
		return databaseManager.getDataSetByQuery($servidor, "select cuenta_nueva, cuenta_busca from cuentas where empresa = ? order by capitulo, subcapitulo, rubro, cuenta,subcuenta", args, 100);
	}
	else 
		if (displayValue != null) 
		{
// devuelve los valores que va filtrando segun lo que va poniendo en el TYPE_AHEAD
			var args = new Array() 
			args[0]="%"+ displayValue+ "%"
			args[1]=globals.gUservID
			return databaseManager.getDataSetByQuery($servidor, "select cuenta_nueva, cuenta_busca from cuentas where upper(cuenta_nueva) like upper(?) and empresa = ? order by capitulo, subcapitulo, rubro, cuenta,subcuenta", args, 100);
		}
		else
			if (realValue != null) 
			{
// Devuelve el valor que tiene el campo, si es que ya tiene uno			
				var args = new Array() 
				args[0]=realValue
				args[1]=globals.gUservID		
				return databaseManager.getDataSetByQuery($servidor, "select cuenta_nueva, cuenta_busca from cuentas where cuenta_busca = ? and empresa = ? order by capitulo, subcapitulo, rubro, cuenta,subcuenta", args, 1);
   			}
	return null
}

/**
 * Called when the valuelist needs data, it has 3 modes.
 * real and display params both null: return the whole list
 * only display is specified, called by a typeahead, return a filtered list
 * only real value is specified, called when the list doesnt contain the real value for the give record value, this will insert this value into the existing list
 *
 * @param {String} displayValue The value of a lookupfield that a user types
 * @param {Object} realValue The real value for a lookupfield where a display value should be get for
 * @param {JSRecord} record The current record for the valuelist. (This is the FindRecord in find mode, which is like JSRecord has all the columns/dataproviders, but doesn't have its methods)
 * @param {String} valueListName The valuelist name that triggers the method.
 *
 * @returns {JSDataSet} A dataset with 1 or 2 columns display[,real]
 *
 * @properties={typeid:24,uuid:"84D556E1-1EFC-4F7B-B396-F371EF567E48"}
 */
function dsBienBusca(displayValue, realValue, record, valueListName) {
	var fServidor = 'contable'

	if (displayValue == null && realValue == null) {
		// Toda la lista
		var args = [globals.gUservID]
		return databaseManager.getDataSetByQuery(fServidor, "select bien_busca, codigo from bienes where empresa = ? order by codigo", args, 100);
	} else if (displayValue != null) {
		// Lista filtrada
		var args = ["%" + displayValue + "%",globals.gUservID]//, displayValue]
		return databaseManager.getDataSetByQuery(fServidor, "select bien_busca, codigo from bienes where upper(bien_busca) like upper(?) and empresa = ? order by codigo", args, 100);
	} else if (realValue != null) {
		// Devuelve el valor del que esta elegido
		var args = [realValue];
		return databaseManager.getDataSetByQuery(fServidor, "select bien_busca, codigo from bienes where codigo = ? order by codigo", args, 1);
	}
	return null;
}

/**
 * Record pre-insert trigger.
 * Validate the record to be inserted.
 * When false is returned the record will not be inserted in the database.
 * When an exception is thrown the record will also not be inserted in the database but it will be added to databaseManager.getFailedRecords(),
 * the thrown exception can be retrieved via record.exception.getValue().
 *
 * @param {JSRecord<db:/contable/cuentas>} record record that will be inserted
 *
 * @returns {Boolean}
 *
 * @properties={typeid:24,uuid:"11B75D5C-A66A-4079-B027-F476D085B3A3"}
 */
function onRecordInsert_cuenta(record) {
	
	var $query = 'SELECT cuenta_id FROM cuentas WHERE capitulo = ? and '+
				' subcapitulo = ? and rubro = ? and cuenta = ? and subcuenta = ?'
	var $args = [record.capitulo,record.subcapitulo,record.rubro,record.cuenta,record.subcuenta]
	var $ds = databaseManager.getDataSetByQuery('contable',$query,$args,-1)
	if ($ds.getMaxRowIndex() > 0)
		return false

	record.cuenta_busca = 	utils.numberFormat(record.capitulo,"#") + 
							utils.numberFormat(record.subcapitulo,"#" ) + 
							utils.numberFormat(record.rubro,"#") +
						    utils.numberFormat(record.cuenta,"0000") + 
						    utils.numberFormat(record.subcuenta,"0000");
						    
	if (record.subcuenta != 0)
	{
		record.cuenta_formato = utils.numberFormat(record.capitulo,"#")
								+"."+utils.numberFormat(record.subcapitulo,"#")
								+"."+utils.numberFormat(record.rubro,"#")
								+"."+utils.numberFormat(record.cuenta,"0000")
								+" "+utils.numberFormat(record.subcuenta,"0000");
		var texcta = record.subcuentas_to_cuentas.descripcion
		record.cuenta_nueva = utils.numberFormat(record.capitulo,"#")+
								utils.numberFormat(record.subcapitulo,"#")+
								utils.numberFormat(record.rubro,"#")+
								utils.numberFormat(record.cuenta,"0000")+
	     						utils.numberFormat(record.subcuenta,"0000")+" "+
	     						utils.stringTrim(texcta) + " - " + record.descripcion;
		record.cuenta_impresion = utils.numberFormat(record.capitulo,"#")+
									utils.numberFormat(record.subcapitulo,"#")+
	          						utils.numberFormat(record.rubro,"#")+
	          						utils.numberFormat(record.cuenta,"0000")+" "+
	          						utils.numberFormat(record.subcuenta,"0000")+" "+
	          						utils.stringTrim(texcta) + " - " + record.descripcion;


	}
	else
	{
		record.cuenta_formato = utils.numberFormat(record.capitulo,"#")
								+"."+utils.numberFormat(record.subcapitulo,"#")
								+"."+utils.numberFormat(record.rubro,"#")
								+"."+utils.numberFormat(record.cuenta,"0000")
								+ "         " 
		record.cuenta_nueva = utils.numberFormat(record.capitulo,"#")+
	    						utils.numberFormat(record.subcapitulo,"#")+
	      						utils.numberFormat(record.rubro,"#")+
	      						utils.numberFormat(record.cuenta,"0000")
	      						+"         "+record.descripcion;
		record.cuenta_impresion = utils.numberFormat(record.capitulo,"#")+
									utils.numberFormat(record.subcapitulo,"#")+
	      							utils.numberFormat(record.rubro,"#")+
	      							utils.numberFormat(record.cuenta,"0000")+
	      							"         "+record.descripcion;
		      						
	}
	return true
}

/**
 * Record pre-insert trigger.
 * Validate the record to be inserted.
 * When false is returned the record will not be inserted in the database.
 * When an exception is thrown the record will also not be inserted in the database but it will be added to databaseManager.getFailedRecords(),
 * the thrown exception can be retrieved via record.exception.getValue().
 *
 * @param {JSRecord<db:/contable/asiento>} record record that will be inserted
 *
 * @returns {Boolean}
 *
 * @properties={typeid:24,uuid:"9FC8AD90-7A6C-4170-BABF-C1CABA849F09"}
 */
function onRecordInsert_asiento(record) {
	record.aux_cuenta = utils.numberFormat(record.asiento_to_cuentas.capitulo,"#") + utils.numberFormat(record.asiento_to_cuentas.subcapitulo,"#")+
	  					utils.numberFormat(record.asiento_to_cuentas.rubro,"#")	   + utils.numberFormat(record.asiento_to_cuentas.cuenta,"0000")+
	  					utils.numberFormat(record.asiento_to_cuentas.subcuenta,"0000");
 				  
 	record.cuenta_impresion 		= record.asiento_to_cuentas.cuenta_impresion;
 	record.cuenta_nombre_impresion 	= record.asiento_to_cuentas.descripcion;
	
	var $imp_carga
	if (globals.gMonedaCarga == 1) // 1-Pesos 2-Dolares
 	{
 		$imp_carga = record.importe
 	}
 	else
 	{
 		$imp_carga = record.impodol
 	}
	
	if (record.columna == "D")
	{
		record.importe_haber 	= null
		record.haber_pesos 		= null
		record.haber_dolar 		= null;
		record.importe_debe 	= $imp_carga
		record.debe_pesos 		= record.importe
		record.debe_dolar 		= record.impodol
	}
	else
	{
		record.importe_haber 	= $imp_carga
		record.haber_pesos 		= record.importe
		record.haber_dolar 		= record.impodol
		record.importe_debe 	= null
		record.debe_pesos 		= null
		record.debe_dolar 		= null
	}
	return true
}

/**
 * Record pre-insert trigger.
 * Validate the record to be inserted.
 * When false is returned the record will not be inserted in the database.
 * When an exception is thrown the record will also not be inserted in the database but it will be added to databaseManager.getFailedRecords(),
 * the thrown exception can be retrieved via record.exception.getValue().
 *
 * @param {JSRecord<db:/contable/asiento_prov>} record record that will be inserted
 *
 * @returns {Boolean}
 *
 * @properties={typeid:24,uuid:"40882992-1A78-43B2-9832-367AB89F24ED"}
 */
function onRecordInsert_asiento_prov(record) {
	// throw exception to pass info to handler, will be returned in record.exception.getValue() when record.exception is a DataException
	record.aux_cuenta = utils.numberFormat(record.asiento_prov_to_cuentas.capitulo,"#")+utils.numberFormat(record.asiento_prov_to_cuentas.subcapitulo,"#")+
	  utils.numberFormat(record.asiento_prov_to_cuentas.rubro,"#")+utils.numberFormat(record.asiento_prov_to_cuentas.cuenta,"0000")+
 				  utils.numberFormat(record.asiento_prov_to_cuentas.subcuenta,"0000");
	return true
}

/**
 * Called when the valuelist needs data, it has 3 modes.
 * real and display params both null: return the whole list
 * only display is specified, called by a typeahead, return a filtered list
 * only real value is specified, called when the list doesnt contain the real value for the give record value, this will insert this value into the existing list
 *
 * @param {String} displayValue The value of a lookupfield that a user types
 * @param realValue The real value for a lookupfield where a display value should be get for
 * @param {JSRecord} record The current record for the valuelist.
 * @param {String} valueListName The valuelist name that triggers the method. (This is the FindRecord in find mode, which is like JSRecord has all the columns/dataproviders, but doesn't have its methods)
 * @param {Boolean} findMode True if foundset of this record is in find mode
 * @param {Boolean} rawDisplayValue The raw displayValue without being converted to lower case
 *
 * @returns {JSDataSet} A dataset with 1 or 2 columns display[,real]
 *
 * @properties={typeid:24,uuid:"3E84000F-5D9B-4F76-BBA5-6A7F49384AA8"}
 */
function getDataSetForEjercicios(displayValue, realValue, record, valueListName, findMode, rawDisplayValue) {
	if (displayValue == null && realValue == null) {
		var $sql = 'SELECT descripcion, ejercicio_id FROM ejercicios WHERE empresa = ?'
		var $args = [globals.gUservID]
	} else if (displayValue != null) {
		var $sql = 'SELECT descripcion, ejercicio_id FROM ejercicios WHERE upper(descripcion) LIKE upper(?) AND empresa = ?'
		var $args = ['%' + displayValue + '%', globals.gUservID]
	} else if (realValue != null) {
		var $sql = 'SELECT descripcion, ejercicio_id FROM ejercicios WHERE empresa = ?'
		var $args = [globals.gUservID]
	}
	var $ds = databaseManager.getDataSetByQuery('contable',$sql,$args,-1)
	return $ds;

}

/**
 * @param {Number} pAnio
 * @param {Number} pMes
 * 
 * @properties={typeid:24,uuid:"1F2200AD-991D-40D9-9826-2ACEA9C273DF"}
 */
function gAltaNumcon(pAnio, pMes) {
	var $sql = 'SELECT numcon_id FROM numcon WHERE empresa = ? AND anio = ? AND mes = ?'
	var $args = [globals.gUservID, pAnio,pMes]
	var $ds = databaseManager.getDataSetByQuery('contable',$sql,$args,-1)
	if ($ds.getMaxRowIndex() > 0)
	{
		return false
	}
	/** @type {JSFoundSet<db:/contable/numcon>} */
	var $numcon = databaseManager.getFoundSet('contable','numcon')
	
	$numcon.newRecord()
	$numcon.empresa			= globals.gUservID
	$numcon.anio			= pAnio
	$numcon.mes				= pMes
	$numcon.limbo			= 1
	$numcon.asiento			= 1
	$numcon.ejercicio_id	= globals.gEjercicio
	$numcon.marca_cierre	= 0
	return true
}

/**
 * @param {Date} fecha
 * @properties={typeid:24,uuid:"C9A19647-3141-41ED-9E91-FD5332FAD134"}
 */
function gBuscarCotizacion(fecha) {
	var $sql = 'SELECT valor FROM cotizacion WHERE moneda = ? AND fecha <= ? ORDER BY fecha desc'
	var $args = [globals.zconf_moneda_dolar, fecha]
	var $ds = databaseManager.getDataSetByQuery('contable',$sql,$args,1)
	if ($ds.getMaxRowIndex() == 1)
	{
		return $ds.getValue(1,1)
	}
	return 0
}

/**
 * @param {Number} anio
 * @param {Number} mes
 * 
 * @properties={typeid:24,uuid:"34942BBA-2CB5-4A69-AD91-F00A4255E46A"}
 */
function gFechaEnEjercicioActual(anio, mes) {
	
	if (anio < gejercicio_to_ejercicios.fecha_inicio.getFullYear())
		return false
	if (anio > gejercicio_to_ejercicios.fecha_fin.getFullYear())
		return false
	if (anio == gejercicio_to_ejercicios.fecha_inicio.getFullYear() && mes < (gejercicio_to_ejercicios.fecha_inicio.getMonth()+1))
		return false
	if (anio == gejercicio_to_ejercicios.fecha_fin.getFullYear() && mes > (gejercicio_to_ejercicios.fecha_fin.getMonth()+1))
		return false
	return true
}

/**
 * @param {Number} mes_desde
 * @param {Number} anio_desde
 * @param {Number} mes_hasta
 * @param {Number} anio_hasta
 * 
 * @properties={typeid:24,uuid:"3BC41FC3-6931-415A-8FF1-368D27FB5CF7"}
 */
function gCargarMesesVL(mes_desde, anio_desde, mes_hasta, anio_hasta) {
	var $meses = new Array()
	$meses.push([1,'Enero'])
	$meses.push([2,'Febrero'])
	$meses.push([3,'Marzo'])
	$meses.push([4,'Abril'])
	$meses.push([5,'Mayo'])
	$meses.push([6,'Junio'])
	$meses.push([7,'Julio'])
	$meses.push([8,'Agosto'])
	$meses.push([9,'Septiembre'])
	$meses.push([10,'Octubre'])
	$meses.push([11,'Noviembre'])
	$meses.push([12,'Diciembre'])
	
	var $mes 	= mes_desde
	var $anio 	= anio_desde
	var $ds		= databaseManager.createEmptyDataSet()
	
	while ($mes != mes_hasta || $anio != anio_hasta)
	{
		$ds.addRow([$meses[$mes-1][1] + ' ' + $anio, $meses[$mes-1][0] + '|' + $anio])
		$mes++
		if ($mes == 13)
		{
			$anio++
			$mes = 1
		}
	}
	$ds.addRow([$meses[$mes-1][1] + ' ' + $anio, $meses[$mes-1][0] + '|' + $anio])
	application.setValueListItems('mes_anio',$ds)
}
